package com.guslegend.spzx.manager.service.Impl;



import cn.hutool.core.date.DateUtil;
import com.guslegend.spzx.manager.properties.MinioProperties;
import com.guslegend.spzx.manager.service.FileUploadService;
import io.minio.BucketExistsArgs;
import io.minio.MakeBucketArgs;
import io.minio.MinioClient;
import io.minio.PutObjectArgs;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.util.Date;
import java.util.UUID;

/**
 * @author: guslegend
 * @description: 文件上传服务层
 * @create: 2025-05-08 10:18
 **/
@Service
public class FileUploadServiceImpl implements FileUploadService {

    //使用配置文件的方式读,minio的配置, 不硬编码
    @Autowired
    private MinioProperties minioProperties;
    @Override
    public String fileUpload(MultipartFile file) {
        String fileUrl= null;
        try {
            MinioClient  minioClient =
                    MinioClient.builder()
                            .endpoint(minioProperties.getEndpointUrl())  // MinIO 服务器地址
                            .credentials(minioProperties.getAccessKey(), //  账号
                                    minioProperties.getSecureKey()) //密码
                            .build();

            // 不存在桶就创建
            boolean found =
                    minioClient.bucketExists(BucketExistsArgs.builder().bucket(minioProperties.getBucketName()).build());
//                不能用下滑线连接,拼接访问路径会出错
            if (!found) {
                // 创建
                minioClient.makeBucket(MakeBucketArgs.builder().bucket(minioProperties.getBucketName()).build());
            }
            //创建日期文件夹
            //DataUtil 来自Hutool工具类库
            String path = DateUtil.format(new Date(), "yyyyMMdd");
            //生成随机文件名
            String uuid = UUID.randomUUID().toString().replaceAll("-", "");
            String fileName=path+'/'+uuid+file.getOriginalFilename();

            minioClient.putObject(
                    PutObjectArgs.builder()
                            .bucket(minioProperties.getBucketName())  //桶名称
                            .object(fileName)  //文件名
                            // 采用的是已经知道文件大小的读     -1 表示 不限制分块大小（自动选择最佳方式）
                            .stream(file.getInputStream(), file.getSize(), -1)
                            //设置 文件的 MIME 类型）
                            //让 MinIO 知道如何处理和预览这个文件。
                            .contentType(file.getContentType())
                            .build());
            //手动拼接url,给前端,方便前端作回显示
            fileUrl = minioProperties.getEndpointUrl()+"/"+minioProperties.getBucketName()+'/'+fileName;
        } catch (Exception e) {
            e.printStackTrace();
        }
        //我们是在新增用户的时候给用户添加头像的,你给前端访问路径了, 前端会映射到头像(avator这个字段上), 一点击新增用户,直接就把这个url带到mysql中了, 所有这里就不用写mapper了
        return fileUrl;

    }
}